#include "sdl_input.h"

sdl_input::sdl_input() :
//xres(xr),yres(yr),
sdl_layer(1, "input"), //to jest zadanie o prawie najwyższym priorytecie (wyprzedza je timer)
mouse_x(0),
mouse_rx(0),
mouse_y(0),
mouse_ry(0),
m_x(0), m_y(0),
xsen(1.0), ysen(1.0),
lmb(false),
rmb(false),
mmb(false),
keyboard(NULL)
{

}

///uaktualnia stan urządzeń wejścia

void sdl_input::update()
{
    if (!process_sdl_events()) {
        // TODO prowizorka (przerobić na sygnał)
        if (give<sdl_engine > ()) give<sdl_engine > ()->kill();

        return;
    }

    if (give<sdl_canvas::screen_info > ()) {
        m_x = xsen * (float(mouse_rx) / (float(give<sdl_canvas::screen_info > ()->get_xres()) / 2.0));
        m_y = ysen * (float(mouse_ry) / (float(give<sdl_canvas::screen_info > ()->get_yres()) / 2.0));
    }
}

///przetwarzamy zdarzenia i wyrzucamy false, jeżeli dostaliśmy żądanie zamknięcia aplikacji

bool sdl_input::process_sdl_events()
{
    // bierzemy informacje o położeniu kursora
    SDL_GetMouseState(&mouse_x, &mouse_y);

    // bierzemy informacje o względnym przesunięciu kursora
    SDL_GetRelativeMouseState(&mouse_rx, &mouse_ry);

    // odwracamy mysz, bo SDL liczy piksele od lewego górnego rogu ekranu, a nam się góra nie zgadza w tym
    // mouse_ry=-mouse_ry;
    // mouse_y=-mouse_y;


    // zdejmujemy układ klawiatury do macierzy keyboard
    keyboard = SDL_GetKeyState(NULL);

    // bieżąco przetwarzane zdarzenie wejścia
    SDL_Event ev;

    // iterujemy przez bieżące zdarzenia

    while (SDL_PollEvent(&ev)) {
        switch (ev.type) {

        case SDL_QUIT:
            return false;
            break;

        case SDL_KEYDOWN:

            if (ev.key.keysym.sym == SDLK_ESCAPE)
                return false;

            break;

        case SDL_MOUSEBUTTONDOWN:
            switch (ev.button.button) {

            case SDL_BUTTON_LEFT:
                lmb = true;
                break;

            case SDL_BUTTON_RIGHT:
                rmb = true;
                break;

            case SDL_BUTTON_MIDDLE:
                mmb = true;
                break;
            }

            break;

        case SDL_MOUSEBUTTONUP:

            switch (ev.button.button) {

            case SDL_BUTTON_LEFT:
                lmb = false;
                break;

            case SDL_BUTTON_RIGHT:
                rmb = false;
                break;

            case SDL_BUTTON_MIDDLE:
                mmb = false;
                break;
            }

            break;

        default:
            break;
        }
    }

    return true;
}

template<> sdl_ptr<sdl_input> sdl_singleton<sdl_input>::__field = NULL;

